﻿/**
  @file		i_server.h
  @brief	跨平台网络模块的接口头文件
  @author	RockerLuo
  @version	1.0	2013.8.12 RockerLuo	文件创建
*/
 
#pragma once

#include "platform/platform_types.h"

enum EnumServerResult
{
	eServerResult_GeneralError = -1,
	eServerResult_Success = 0,
	eServerResult_Connected,
	eServerResult_DisConnected,
};

struct IServer
{
	/**
	@brief		开启服务（读写线程开始工作）
	@param
	@return		参见EnumServerResult
	@retval
	*/
	virtual S32	StartService() = 0;
	
	/**
	@brief		停止服务（读写线程停止工作）
	@param
	@return		参见EnumServerResult
	@retval
	*/
	virtual S32 StopService() = 0;
	
	/**
	@brief		断开指定客户端的网络链接
	@param		u32ClientIdx	客户端连接号
	@return		参见EnumServerResult
	@retval
	*/
	virtual S32	DisconnectClient( U32 u32ClientIdx ) = 0;

	/**
	@brief		从指定客户端的网络链接中获取数据，可以获取断开和连接上的情况
	@param		u32ClientIdx	客户端连接号	
	@param		pu8OutData	返回数据的首地址
	@param		u32OutDataSize	返回数据的大小
	@return		参见EnumServerResult
	@retval		如果返回eServerResult_Connected表示客户端连上了，返回eServerResult_DisConnected表示断开
	*/
	virtual	S32 GetPackFromClient( U32 u32ClientIdx, U8*& pu8OutData, U32& u32OutDataSize ) = 0;

	/**
	@brief		给指定客户端的网络链接发送数据，异步发送
	@param		u32ClientIdx	客户端连接号	
	@param		pu8Data	发送数据的首地址
	@param		u32DataSize	发送数据的大小
	@return		参见EnumServerResult
	@retval		返回成功后，数据会被写入到发送缓冲
	*/
	virtual S32 SendPackToClient( U32 u32ClientIdx, U8* pu8Data, U32 u32DataSize ) = 0;
};

extern IServer* CreateServer( U32 u32MaxClientNum, U16 u16ListenPort );
extern void	DestoryServer( IServer* poServer );
